home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / langs / dl_exsrc.zoo / ctlcnv.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-03  |  1.4 KB  |  81 lines

  1. #include <ctype.h>
  2.  
  3. /* Some non-standard macros that the MiNTlibs' ctype.h defines */
  4. #ifndef isodigit
  5. #define isodigit(c)    ( (c)>='0' && (c)<='7' )
  6. #endif
  7. #ifndef toint
  8. #define toint(c)    ( (c) <= '9' ? (c) - '0' : toupper(c) - 'A' + 10)
  9. #endif
  10.  
  11. char *ctlcnv(char *string)
  12. {
  13.   register char *s = string, *t = string;
  14.   register char c;
  15.   register int val;
  16.  
  17.   for (;;) {
  18.     if (*t == '\0') {
  19.       *s = '\0';
  20.       return string;
  21.     } else if (*t != '\\') {
  22.       *s++ = *t++;
  23.     } else if (++t, isodigit(*t)) {
  24.       val = *t++ - '0';
  25.       if (isodigit(*t)) {
  26.     val = (val << 3) + *t++ - '0';
  27.     if (isodigit(*t))
  28.       val = (val << 3) + *t++ - '0';
  29.       }
  30.       *s++ = (char)val;
  31.     } else switch (c = *t++) {
  32.       case 'n':
  33.     *s++ = '\n';
  34.     break;
  35.       case 't':
  36.     *s++ = '\t';
  37.     break;
  38.       case 'v':
  39.     *s++ = '\v';
  40.     break;
  41.       case 'b':
  42.     *s++ = '\b';
  43.     break;
  44.       case 'r':
  45.     *s++ = '\r';
  46.     break;
  47.       case 'f':
  48.     *s++ = '\f';
  49.     break;
  50.       case 'a':
  51.     *s++ = '\a';
  52.     break;
  53.       case '\\':
  54.     *s++ = '\\';
  55.     break;
  56.       case '?':
  57.     *s++ = '?';
  58.     break;
  59.       case '\'':
  60.     *s++ = '\'';
  61.     break;
  62.       case '\"':
  63.     *s++ = '\"';
  64.     break;
  65.       case '\n':
  66.     break;
  67.       case 'x':
  68.     val = 0;
  69.     while (c = *t++, isxdigit(c))
  70.       val = (val << 4) + toint(c);
  71.     t--;
  72.     *s++ = (char)val;
  73.     break;
  74.       default:
  75.     *s++ = '\\';
  76.     *s++ = c;
  77.     break;
  78.     }
  79.   }
  80. }
  81.